#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <cstdlib>
#include <unistd.h>
//函数结果状态代码
  #define TRUE       1
  #define FALSE      0
  #define OK         1
  #define ERROR      0
  #define INFEASIBLE -1
  #define OVERFLOW   -2
  #define NULLL 0

  //Status 是函数的类型，其值是函数结果状态代码
  typedef int Status;
  typedef int ElemType;
  //--定义顺序栈的存储结构  P57
  #define MAXSIZE 100  //顺序栈存储空间的初始分配量
  typedef struct
  {  ElemType  *base;  //栈底指针
     ElemType  *top;   //栈顶指针
	 int stacksize;    //栈可用的最大容量
  }SqStack;            //顺序栈的结构类型

//--顺序栈初始化  算法3.1  P58
Status InitStack(SqStack &S)  //构造一个空栈
{ 
     S.base=new ElemType[MAXSIZE]; //将新开辟的栈基址赋给栈基址指针
     //S.base=(ElemType *)malloc(MAXSIZE *sizeof(ElemType));
     if (!S.base )exit (OVERFLOW);                  //存储分配失败
    S.top = S.base;              //栈顶指针初始化
    S.stacksize = MAXSIZE;  //栈可用的容量初始化
    return OK;
}//InitStack

//--判断栈空算法
Status StackEmpty(SqStack &S)
{
     return S.top==S.base; //若栈顶指针==栈底指针，则返回1（非零即真）  
}// setEmpty

//--入栈  算法3.2  P59
Status Push(SqStack &S,ElemType e)
{//将数据元素e压入到顺序栈S中，使其成为新的栈项元素
   if (S.top-S.base>=S.stacksize)  //如果栈满，则函数返回ERROR
        return ERROR;
    *S.top++=e;                     //将新元素e存放在top所指示的存储单元中,并使top值加1
    return OK;
 }// Push

//遍历顺序栈算法
void OutStack(SqStack S)
{  int i=0;
   SqStack p;
   p.top=S.top;
   if (S.top==S.base)      printf(" stack is empty ! \n");
   while (p.top!=S.base)
   {  printf("    the StackTop %d element data : %6d\n",++i,*(p.top-1));  //输出栈顶元素
      p.top--;//栈顶指针减一
   }
}// OutStack

//出栈算法
Status  Pop(SqStack  &S, ElemType &e) 
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK；否则返回ERROR.
     if (S.top==S.base) return ERROR;   
     e=*(--S.top);//栈顶指针减1，将栈顶元素赋给e
     return OK;
 }//Pop

Status  GetTop(SqStack  S, ElemType &e)
{  //若栈不空,则用e返回S的栈顶元素,并返回OK,
    //否则返回ERROR
     if (S.top==S.base) return  ERROR;   
     e = *S.top; //返回栈顶元素的值，栈顶指针不变
     return OK;
}//GetTop

void setEmpty(SqStack &S)  //置空顺序栈
{
   S.top = S.base; //栈顶指针指向栈底
}// setEmpty

void conversion ()   //数制转换——十进制转换为二进制
{
   SqStack S;
    ElemType N,M,e;
    InitStack(S); //初始化S栈
    printf("   请输入一个十进制数  N 和要转换的进制数 M,两数之间用空格间隔 : ");  
    scanf ("%d%d",&N,&M);
    printf("十进制数 %d 转换为 %d 进制数的结果为: ",N,M);

    while (N!=0)  //当被转换的十进制数不为零时 
    {
      Push(S, N%M);  //求余且余数入栈
      N=N/M;//计算求余时的商N
    }
    while (S.top!=S.base)   //当栈不为空时
    {
       Pop(S,e);   //出栈
       printf ( "%d", e );        //输出
    }

    printf("\n");
} // conversion

//--主函数 
int main( ) {
    ElemType e;
	int i,y,cord;
	SqStack s1;
	printf("============= 实验3 栈的操作 =============\n ");
	printf(" 23计算机科学与技术专升本3  23230810047  李皓天\n ");      //请填写具体的个人信息
	printf(" 测试数据：按要求构成\n ");  //请填写具体测试数据
    printf("=========== 实验报告 2023-11-10 （23计算机专升本3为：2023-11-10）==========\n\n");   //这部分信息应与实验时期对应
    printf("     (1)初始化栈s1 \n");
	//调用的初始化函数（算法）
	InitStack(s1);
    
    printf("     (2)栈为%s\n",(StackEmpty(s1)?"空":"非空"));
    printf("     (3)依次进栈元素2 3 2 3 0 8 1 0 0 4 7\n");
    int arr[11]={2,3,2,3,0,8,1,0,0,4,7};
    for(i = 0; i <= 10; ++i)
     	Push(s1,arr[i]);     //调用的入栈函数（算法）
    printf("     (4)栈为%s\n",(StackEmpty(s1)?"空":"非空"));
    printf("     (5)遍历栈s1: \n");
	OutStack(s1);       //调用的入栈函数（算法）
	printf("     (6)取栈顶元素: ");
	GetTop(s1, e);       //调用取栈顶元素函数（算法）
	printf("%2d\n",e);
	printf("     (7)出栈序列: \n");
	while (!StackEmpty(s1))
	{
		Pop(s1,e);     //调用的出栈函数（算法）
		printf(" %2d ",e);
	}
	printf("\n");
    printf("     (8)数制转换\n");
    conversion();
    printf("     (9)置空顺序栈\n");
	setEmpty(s1);     //调用置空顺序栈函数（算法） 
	printf("     (10)栈为%s\n",(StackEmpty(s1)?"空":"非空"));
return 1;
}